import numpy as np
import matplotlib.pyplot as plt

data=np.loadtxt('ex1data1.txt',delimiter=',')

x=data[:,:-1]
y=data[:,-1]

X=np.c_[np.ones(len(x)),x]

def model(x,theta):
    return x.dot(theta)

def cost(h,y):
    # return 1/(2*len(x))*(train_h-y).T.dot(train_h-y)
    return 0.5*np.mean((h-y)**2)

def grad(x,y,alpha=0.001,iter0=1000):
    # m:样本个数，X的行数
    # n:theta行数，X的列数
    m,n=x.shape
    #任意创建一个初始theta
    theta=np.zeros(n)
    #创建一个数组，存放代价函数值
    J=np.zeros(iter0)
    for i in range(iter0):
        #计算当前theta的预测值
        h=model(x,theta)
        #计算当前梯度，即偏导数
        梯度=1/m*x.T.dot(h-y)
        # 计算当前代价函数值
        J[i]=cost(h,y)
        #更新theta
        theta-=alpha*梯度
    return h,theta,J

if __name__ == '__main__':
    #训练模型
    h,theta,J=grad(X,y)
    print(theta)
    # 画代价函数图
    plt.plot(J)
    plt.show()

    plt.scatter(x, y)
    plt.plot(x, h, c='r')
    plt.show()

